package neuronsPackage;

import java.util.ArrayList;
import java.util.List;
import activationFunctionPackage.FonctionActivation;


public class Neuronne 
{
	private FonctionActivation fonctionActivation;

	private List<Arc>	liensEntrants ;
	private List<Arc>	liensSortants;

	private boolean estNeuronnePremiereCouche;

	private double valeurSortie;

	private String	nom ;

	public Neuronne( String nom ,boolean premiereCouche , FonctionActivation activationFunction) 
	{
		this.nom = nom ;
		liensEntrants = new ArrayList<Arc>();
		liensSortants = new ArrayList<Arc>();
		estNeuronnePremiereCouche = premiereCouche;
		this.fonctionActivation = activationFunction;
	}


	public String toString()
	{
		String s ="";
		s = nom + " ("+estNeuronnePremiereCouche+") ";
		
		s += " ENTREE=[" ;
		for( Arc a : this.liensEntrants)
		{
			s+= " "+ a.getNeuronneDepart().nom + " ("+a.getPoids()+")";
		}
		s+="]";
		
		s += " SORTIES=[" ;
		for( Arc a : this.liensSortants)
		{
			s+= " "+ a.getNeuronneArrivee().nom + " ("+a.getPoids()+")";
		}
		s+="]";
		
		return s;
	}

	public double calculErreur(double valeurAttendue) 
	{
		return valeurAttendue - valeurSortie;
	}




	public void setValeurSortie(double sortie)
	{
		if(estNeuronnePremiereCouche)valeurSortie = sortie;
		//System.out.println("la neuronne depart a pour sortie :"+sortie);
	}
		
	public double calculerValeurSortie()
	{
		//System.out.println("la neuronne intermediare a pour entree :");
		
		double sommeEntrees = calculerSommeEntrees();
		
		//System.out.println("somme : "+sommeEntrees);
		
		valeurSortie = fonctionActivation.activation(sommeEntrees);
		
		//System.out.println("valeurSortie : "+valeurSortie);
		
		return valeurSortie ;
		
	}

	public double calculerSommeEntrees()
	{
		double sommeEntrees = 0;
		for (Arc link : liensEntrants)
		{
			//System.out.println("> "+link.getNeuronneDepart().getSignalDeSortie()+" * "+link.getPoids());
			sommeEntrees += link.getNeuronneDepart().getSignalDeSortie() * link.getPoids();
		}
		return sommeEntrees ;
	}

	public void seConnecter(Neuronne destination, double poids)
	{
		Arc arc = new Arc(this, destination, poids);
		this.liensSortants.add(arc);
		destination.liensEntrants.add(arc);
	}

	
	public List<Arc> getLiensEntrants()
	{
		return liensEntrants;
	}

	public List<Arc> getLiensSortants()
	{
		return liensSortants;
	}
	
	public double getSignalDeSortie() 
	{
		return valeurSortie;
	}
	
	public FonctionActivation getFonctionActivation()
	{
		return fonctionActivation;
	}

}
